package com.wgy.day33其他增强流.缓冲流.字符缓冲流;

import java.io.*;
import java.util.HashMap;
import java.util.Set;

/**
 * Created by pc on 2020/12/5 22:51
 * Description: LearningJava
 */
/*
对文件进行排序:  D:\小云\abc\b\c.txt
              按照(1,2,3...)顺序排序
分析:
     1.创建一个HashMap集合对象,用来存储文件的序号(key)和对应的文本(value)
     2.创建字符缓冲输入流对象,构造方法中绑定字符输入流
     3.创建字符缓冲输出流对象,构造方法中绑定字符输出流
     4.使用字符缓冲输入流中的readline,逐行读取文本
     5.对文本进行分割,获取其中的序号和文本内容
     6.把切割好的序号和文本的内容存储到HashMap集合中(key序号是有序的,会自动排序1234...)
     7.遍历HashMap集合,获取每一个键值对
     8.把每一个键值对,拼接成一个文本行
     9.把拼接好的文本使用字符缓冲输出流中的方法write,写入到文件中
     10.释放资源

*/
public class Demo03test {
    public static void main(String[] args) throws IOException {
        //1.创建一个HashMap集合对象,用来存储文件的序号(key)和对应的文本(value)
        HashMap<String, String> map = new HashMap<>();
        //2.创建字符缓冲输入流对象,构造方法中绑定字符输入流


//        InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "GBK");
//        InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8");


        File file = new File("D:\\小云\\abc\\b\\c_ANSI.txt");
        //todo windows的记事本默认保存的模式,默认是ansi编码 即中文编码,使用方式需要对应的解码方式,即GBK,也就是中文解码
        // 具体原理看这篇文章 https://blog.csdn.net/mqdxiaoxiao/article/details/106463952
        // java默认编码和解码模式都是采用UTF-8的模式 所以想用java的方式去解析你所在文件的,也就是直接可以用,不用指定什么编码的那么最简单的方法
        // 是将你的文件保存的时候使用utf-8保存的模式,那么你就能读文字了,这里有个比喻,比如我和小云说话用中文,对方能听懂,因为我知道中文,小云也知道中文
        // 但是我和小云说话用德文,小云没学过德语,那么小云就听不懂了,那么我说的可能在小云看来可能在乱讲

        InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "GBK");
        BufferedReader br = new BufferedReader(isr);

        //3.创建字符缓冲输出流对象,构造方法中绑定字符输出流
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\小云\\abc\\b\\d.txt"));

        //4.使用字符缓冲输入流中的readline,逐行读取文本
        String line;
        while ((line = br.readLine()) != null) {
            //5.对文本进行分割,获取其中的序号和文本内容
            String[] arr = line.split("\\.");
            //6.把切割好的序号和文本的内容存储到HashMap集合中(key序号是有序的,会自动排序1234...)
            if (arr.length>1) {// TODO: 2020/12/11 当程序读取空行的时候,数组长度只有1,而我读取了arr[1]就会出现数组越界异常,数组总长度就只有1,不可能有第二个元素,所以这里我们限定下,一定要求数组元素有两个或更多的时候我们才执行程序,而不是改目标源文件,因为目标源文件可能会很复杂
                System.out.println(arr[1]);
                map.put(arr[0], arr[1]);
            }

        }
        ;
        //7.遍历HashMap集合,获取每一个键值对
        Set<String> set = map.keySet();
        for (String key : set) {
            String value = map.get(key);
            //8.把每一个键值对,拼接成一个文本行
            line = key + "." + value;
            // 9.把拼接好的文本使用字符缓冲输出流中的方法write,写入到文件中
            bw.write(line);
        }
        //10.释放资源
        bw.close();
        br.close();


    }
}
